/*--------------------------------------------------------------------------------------------------------------------
 *  -------------------------------------------------------------------------------------------------------------------
 *
 *  Filename: dev_api.h
 *
 *  Description: AT interface prototypes for yuge AT commands
 *
 *  History:
 *  Jan 9, 2020- Li Tang Creation of file
 *
 *  Notes:
 *
 ******************************************************************************/
#ifndef _DEV_API_H
#define _DEV_API_H

#include "gbl_types.h"


/*****************************************************************
* Function: dev_IsProductionMode
*
* Description:
* 	该函数用于判断模块当前是否在生产模式。
* 	如果有提供固件给原厂生的需求，需要重启时需要判定再非生产模式中，避免生产过程中异常重启
* Parameters:
* 	None
* Return:
* 	 TRUE :  生产模式中
* 	 FALSE :  正常模式中
*
*****************************************************************/
BOOL dev_IsProductionMode(void);
/*
	客户编写代码时，可能会有需要重启的场景，如果是提供固件给工厂生产的话，
	工厂生产时需要进行RF校准和号码烧写，此时需要避免异常重启对生产造成影响，此时可以这样处理。
	
	void oem_dev_reset(void)
	{
		if (!dev_IsProductionMode()){
			dev_CtrlReset(0)
		}
	}

	V3.0.0后的SDK，无需再判断，sdk内部已经判断了
*/

/*****************************************************************
* Function: dev_SetAppVersion
*
* Description:
* 	该函数用于设置APP版本号， 可以通过AT+APPVER读取。
* 	如果有提供固件给原厂生的需求，提供给原厂区分版本号使用。
* Parameters:
* 	str	  	客户自定义的APP版本号
* Return:
* 	 None
*****************************************************************/
void dev_SetAppVersion(char *str);

/*****************************************************************
* Function: dev_GetImei
*
* Description:
* 	该函数用于获取IMEI。
* Parameters:
* 	pBuf 		[out] 	pBuf
* 	size        [in] 	pBuf的Size
* Return:
* 	 TRUE :  成功
* 	 FALSE :  失败
*****************************************************************/
BOOL dev_GetImei(char *pBuf, size_t size);


/*****************************************************************
* Function: dev_GetSn
*
* Description:
* 	该函数用于获取SN。
* Parameters:
* 	pBuf 		[out] 	pBuf
* 	size        [in] 	pBuf的Size
* Return:
* 	 TRUE :  成功
* 	 FALSE :  失败
*****************************************************************/
BOOL dev_GetSn(char *pBuf, size_t size);


/*****************************************************************
* Function: dev_GetSleep
*
* Description:
* 	该函数用于获取当前自动休眠的flag。
* Parameters:
* 	None
* Return:
* 	 0 :  不允许模块自动休眠
* 	 1 :  允许模块自动休眠，待休眠条件满足后自动休眠。
*****************************************************************/
BOOL dev_GetSleep(void);


/*****************************************************************
* Function: dev_SetSleep
*
* Description:
* 	该函数用于设置当前自动休眠的flag。
* Parameters:
* 	sleep        [in] 	pBuf的Size
* 					0 :  不允许模块自动休眠
* 					1 :  允许模块自动休眠，待休眠条件满足后自动休眠。
* Return:
* 	 None
*****************************************************************/
void dev_SetSleep(BOOL sleep);

/*****************************************************************
* Function: dev_CtrlReset
*
* Description:
* 	该函数用于控制模块重启。
* Parameters:
* 	reason        [in] 	重启reason
* 					0 :  直接重启
* 					1 :  先进入飞行模式，再重启
* Return:
* 	 None
*****************************************************************/
void dev_CtrlReset(int reason);

/*****************************************************************
* Function: dev_CtrlPoweroff
*
* Description:
* 	该函数用于控制模块关机。
* Parameters:
* 	reason        [in] 	关机reason
* 					0 :  直接关机
* 					1 :  先进入飞行模式，再关机
* Return:
* 	 None
*****************************************************************/
void dev_CtrlPoweroff(int reason);

typedef enum DevSimStateEnum {

	DEV_SIM_STA_NOT_INSERTED,
	DEV_SIM_STA_READY,
	DEV_SIM_STA_SIM_PIN,
	DEV_SIM_STA_SIM_PUK,
	DEV_SIM_STA_PH_SIM_LOCK_PIN,
	DEV_SIM_STA_PH_SIM_LOCK_PUK,
	DEV_SIM_STA_PH_FSIM_PIN,
	DEV_SIM_STA_PH_FSIM_PUK,
	DEV_SIM_STA_SIM_PIN2,
	DEV_SIM_STA_SIM_PUK2,
	DEV_SIM_STA_PH_NET_PIN,
	DEV_SIM_STA_PH_NET_PUK,
	DEV_SIM_STA_PH_NET_SUB_PIN,
	DEV_SIM_STA_PH_NET_SUB_PUK,
	DEV_SIM_STA_PH_SP_PIN,
	DEV_SIM_STA_PH_SP_PUK,
	DEV_SIM_STA_PH_CORP_PIN,
	DEV_SIM_STA_PH_CORP_PUK,
	DEV_SIM_STA_BUSY,
	DEV_SIM_STA_BLOCKED,
	DEV_SIM_STA_FAILURE,

	DEV_SIM_STA_NUM_STATUS	/**< Number of status values defined */	
} _DevSimStateE;

typedef UINT8 DevSimState;

/*****************************************************************
* Function: dev_GetSIMState
*
* Description:
* 	该函数用于获取SIM卡状态。
* Parameters:
* 	None
* Return:
* 	 DevSimState
*****************************************************************/
UINT8 dev_GetSIMState(void);


/*****************************************************************
* Function: dev_GetSIMReady
*
* Description:
* 	该函数用于判定SIM卡是否Ready。
* Parameters:
* 	None
* Return:
* 	 0 :  未Ready
* 	 1 :  Ready。
*****************************************************************/
BOOL dev_GetSIMReady(void);

/*****************************************************************
* Function: dev_GetSIMImsi
*
* Description:
* 	该函数用于获取SIM卡的imsi。
* Parameters:
* 	pBuf 		[out] 	pBuf
* 	size        [in] 	pBuf的Size
* Return:
* 	 TRUE :  成功
* 	 FALSE :  失败
*****************************************************************/
BOOL dev_GetSIMImsi(char *pBuf, size_t size);

/*****************************************************************
* Function: dev_GetSIMIccid
*
* Description:
* 	该函数用于获取SIM卡的iccid。
* Parameters:
* 	pBuf 		[out] 	pBuf
* 	size        [in] 	pBuf的Size
* Return:
* 	 TRUE :  成功
* 	 FALSE :  失败
*****************************************************************/
BOOL dev_GetSIMIccid(char *pBuf, size_t size);

typedef enum
{
	CM_SIM_0,
	CM_SIM_1,
	NUM_OF_CM_SIM
}CMSimID;

/*****************************************************************
* Function: dev_SetSIMId
*
* Description:
* 	该函数用于设置SIM卡ID。
* Parameters:
* 	id        [in] 	SIM卡ID
* 					0 :  卡1
* 					1 :  卡2
* Return:
* 	 TRUE :  成功
* 	 FALSE :  失败
*****************************************************************/
BOOL dev_SetSIMId(UINT8 id);

/*****************************************************************
* Function: dev_GetSIMId
*
* Description:
* 	该函数用于获取SIM卡ID。
* Parameters:
* 	None
* Return:
* 	0 :  卡1
* 	1 :  卡2
*****************************************************************/
UINT8 dev_GetSIMId(void);


/*****************************************************************
* Function: dev_SetSIMDetectGpio
*
* Description:
* 	该函数用于设置SIM1卡热插拔对应的GPIO，大部分情况无需修改。
* Parameters:
* 	gpio        [in] 	GPIO号
* Return:
* 	None
*****************************************************************/
void dev_SetSIMDetectGpio(UINT8 gpio);


/*****************************************************************
* Function: dev_EnableSIMDetect
*
* Description:
* 	该函数用于启用SIM卡热插拔。
* Parameters:
* 	detect	  		[in] 	启用/禁用 SIM 卡检测功能。
* 							0: 禁用
* 							1: 启用
* 	level	  		[in] 	插入SIM 卡时，引脚检测的电平
* 							0: 低电平
* 							1: 高电平
* Return:
* 	None
*****************************************************************/
void dev_EnableSIMDetect(UINT8 detect, UINT8 level);

/*****************************************************************
* Function: dev_DisableSIMDetect
*
* Description:
* 	该函数用于禁用SIM卡热插拔。
* Parameters:
* 	None
* Return:
* 	None
*****************************************************************/
void dev_DisableSIMDetect(void);


/*****************************************************************
* Function: dev_GetChipId
*
* Description:
* 	该函数用于获取芯片ID。
* Parameters:
* 	None
* Return:
* 	ChipId: 0x1602/0x1606 用于区分1602和1606模块
*****************************************************************/
UINT32 dev_GetChipId(void);


/*****************************************************************
* Function: dev_GetSDKVersion
*
* Description:
* 	该函数用于获取SDK版本号，主要用于跟随cp_160xX.bin更新变动。
* Parameters:
* 	None
* Return:
* 	SDKVersion: SDK版本号
*****************************************************************/
char* dev_GetSDKVersion(void);

/*****************************************************************
* Function: dev_GetCpVersion
*
* Description:
* 	该函数用于获取CP版本号，主要用于跟随cp_160xX.bin更新变动，主要用于区分cp版本，app版本中最好记录改版本，sdk大版本更新后，如需fota可能需要判定该版本号。
* Parameters:
* 	None
* Return:
* 	CpVersion: CP版本号
*****************************************************************/
char* dev_GetCpVersion(void);

/*****************************************************************
* Function: dev_SetAtiInfo
*
* Description:
* 	该函数用于更新 ATI、AT+CGMI、AT+CGMM、AT+CGMR 内容显示。
* Parameters:
* 	cgmi	  		[in] 	cgmi string
* 	cgmm	  		[in] 	cgmm string
* 	cgmr	  		[in] 	cgmr string
* Return:
* 	None
*****************************************************************/
void dev_SetAtiInfo(char *cgmi, char *cgmm, char *cgmr);

#endif

